[初心者向け] APEX ドメインと CNAME レコード制約についてまとめてみた
アノテーション、テクニカルサポートチームの村上です。
前職では法人営業として働いていたので、ドメイン関連のお問い合わせや手続きの依頼をよくいただきました。
基本的な DNS レコードについては、当時からそれなりに分かっていましたが、正直 APEX ドメインについては何となく知っているという感じでした。
本ブログでは、「サブドメインとは?」といった基本事項の確認から、何故 APEX ドメインで CNAME レコードを利用すると問題が発生するかについて考えてみます。
なお、本ブログを 7 割ぐらい書き上げた時に、DevelopersIO 内において同じ視点で書かれた素晴らしい記事を見つけてしまいましたが、自分の言葉でもまとめてみることにしました。
資料としては、下記ブログをご利用ください。
APEX ドメインって何?
まず、APEX ドメインの見た目ですが、こんな感じでスッキリしています。
example.com
独自ドメインの左側に "." とホスト名がつかない状態のドメインを APEX ドメインと呼びます。
ネイキッドドメイン、Zone Apex とも呼ばれます。
独自ドメインの左側に "." とホスト名を伴うと、サブドメインとなります。
上記の形で真っ先に思いつくのは、www.example.com ではないでしょうか?
良い機会なので、サブドメインの定義についても今一度確認をしてみようと思います。
サブドメインとは
サブドメインは、RFC1034 において以下のように定義されています。
ドメインが別のドメインに包含される場合、そのドメインのサブドメインになる。この関係は、サブドメインの名前がそれを包含するドメイン名で終わっているかどうかを見ることで検査することができる。例えば、A.B.C.DはB.C.D、C.D、D、" "のサブドメインである。
上記内容をドメイン example.com を例に考えてみます。
以下、全てのドメインは example.com のサブドメインとなります。
finance.example.com
news.example.com
books.example.com
travel.example.com
stockmarket.finance.example.com
sports.news.example.com
food.books.example.com
domestic.travel.example.com
サブドメインの作り方ですが、ドメインの左に "." を付け、ジャンル等で細分化していくのが一般的です。
"." をサブドメインの左に更に追加することで、ジャンル books の中の food というサブドメイン food.books.example.com を作成することも可能です。
サブドメインの定義について確認したところで、再度 APEX ドメインにどんな特性があるのか考えてみたいと思います。
APEX ドメインをゾーンファイルへ記述してみる
APEX ドメインを用いて A レコードでホームページのグローバル IP アドレスを指定した場合、ゾーンファイルは下記のような記述になります。(ざっくりと書いてます。)
サブドメイン www.example.com を利用して A レコードを指定した場合と比べて、www. を省略することができ、URL の記載を短くすることができるのが APEX ドメインを利用するメリットの 1 つです。
前職においても、お客様から URL の記載を短くする為に利用したいとご相談をいただきました。
何となく、APEX ドメインでサイト運営した方が良いかなと思われてきたのではないでしょうか?
ただし、この APEX ドメインには、CNAME レコードを利用できないという制約があります。
(実際には CNAME レコードの制約の為、APEX ドメインに CNAME レコードが使えないのですが。)
となると、APEX ドメインでは、 CDN(Contents Delivery Network)サービスのように、IP アドレスでは無く DNS 名として接続先が提供されるサービスは使えないことになってしまいます。
APEX ドメインを CDN サービスで利用可能かを調べる前に、今度は CNAME の制約について調べてみたいと思います。
CNAME の制約
A CNAME record is not allowed to coexist with any other data. In other words, if suzy.podunk.xx is an alias for sue.podunk.xx, you can't also have an MX record for suzy.podunk.edu, or an A record, or even a TXT record. Especially do not try to combine CNAMEs and NS records like this!:
日本語訳
CNAME レコードは、他のデータと共存することはできません。言い換えるなら、もし suzy.podunk.xx が sue.podunk.xx の別名であれば、suzy.podunk.edu は MX レコードや、A レコード、あるいは TXT レコードさえも持つことはできません。特に、CNAME と NS レコードを下記のように組み合わせようとしないでください。
正直、RFC ドキュメントの例えを読むとかえって混乱するのですが、上記の内容を分かりやすく言うと、CNAME レコードで利用しているレコード名と同一のレコード名で、別タイプのレコードを指定できないという意味となります。
例えば、下記のようにサブドメイン www.example.com を CNAME レコードで登録し、かつ同じレコード名 www.example.com を A レコードとして登録するのは RFC 1912 の規約違反となります。
では、APEX ドメイン example.com のゾーンファイルに CNAME レコードを記述した場合はどうなるでしょうか?
実際に、APEX ドメインのゾーンファイルへ CNAME レコードを記述してみると、APEX ドメインで CNAME レコードが利用できない理由がよく分かります。
他レコードと共存できないはずの CNAME レコードが、APEX ドメインでは NS レコード、SOA レコード等と同一のレコード名で共存してしまいます。
エイリアスレコード
長い前振りでしたが、ここで Amazon Route 53 のエイリアスレコードが登場します。
CNAME レコードとは異なり、DNS 名前空間の最上位ノード (Zone Apex とも呼ばれる) にエイリアスレコードを作成できます。例えば、example.com という DNS 名を登録する場合、Zone Apex は example.com になります。example.com に対して CNAME レコードは作成できませんが、(www.example.com に CNAME レコードがない限り) www.example.com に対してトラフィックをルーティングするエイリアスレコードを作成できます。
正直、エイリアスレコードは CNAME レコードより何か便利なレコードぐらいの認識でしたが、CNAME レコードの他レコードと共存できない制約を回避してくれていたんですね。
Cloudflare の APEX ドメインへの対応
他の CDN サービスでは、どのように CNAME 制約を回避しているかについて調べてみました。
Cloudflare では、CNAME Flattening という機能で CNAME の制約を回避して、APEX ドメインに対して CDN サービスの提供がされていました。
CNAME Flatteningといって、DNS設定画面の見掛け上はCNAMEとなりますが、実際に動作はDNSクエリーの問い合わせ元に対してAレコードとして振る舞います。 応答するアドレスは転送先のFQDNの名前解決を再帰的に行い、返されたアドレスを問い合わせ元に返し、同時にCloudflare内にキャッシュします。
まとめ
何故 APEX ドメイン利用時に CNAME レコードが利用できないのかと聞かれて、即答できる人は少ないかと思います。
一つ一つは基本事項の確認なのですが、こういったことを自分の言葉で説明できるようになりたいものです。
この記事がどなたかのお役に立てば幸いです。